用sklearn进行降维的七种方法
引言
在实际的应用中,有时候我们会遇到数据的维度太少,我们需要新生成新的维度,可以用我们之前的分享(如何自动化进行特征工程);有时候维度太多,这时候我们就需要降维了。降维的方法有许多,我们这里介绍了sklearn中介绍的7种,供大家学习和收藏。
01
PCA
01
普通PCA
主成分分析(PCA)用于将多维的数据集分解为一组具有最大方差的连续正交分量。在sklearn这个包中,PCA是一个transformer对象,使用fit方法可以选择前n个主成分,并且用于投射到新的数据中。
PCA有两种实现方式,一种是特征值分解去实现,一种是奇异值分解去实现。特征值分解是一个提取矩阵特征很不错的方法,但是它只是对方阵而言的,如果不使用SVD,PCA只会寻找每个特征的中心,但并不会对数据进行缩放(scaled)。使用参数whiten=True
,可以将数据投射到奇异空间中,并且将每个组分缩放到方差为1,这个对于后续分析中,假设每个特征是isotropy 是很有帮助的,例如SVM和Kmeans聚类。
PCA不仅仅是对高维数据进行降维,更重要的是经过降维去除了噪声,发现了数据中的模式。PCA把原先的n个特征用数目更少的m个特征取代,新特征是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的m个特征互不相关。
SVD是一种矩阵分解法,把一个大矩阵分解成易于处理的形式,这种形式可能是两个或多个矩阵的乘积。
参数
n_components:可以是int,float,或者“mle”。如果是int,那么是选择对应的主成分数,如果是float,那么会自动合适的组成份数,使得方差大于float;如果是“mle”,会自动地选择合适的主成分。
whiten :白化,使得每个特征具有相同的方差。
属性
components_ :返回具有最大方差的成分。
explained_variance_: 各个主成分的解释的方差。
explained_variance_ratio_ :返回所保留的n个成分各自的方差百分比。
n_components_:返回所保留的成分个数n。
方法
fit() : 对PCA进行训练。
fit_transform(): 训练后,进行降维。
inverse_transform():将降维后的数据转化成原始数据。
transform() : 对训练好的模型,进行转换。
实例
例子1 :基本的使用
1import numpy as np
2from sklearn.decomposition import PCA
3X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
4pca = PCA(n_components=2)
5pca.fit(X)
6print(pca.explained_variance_ratio_) ### 获得每个主成分解释的比例
7print(pca.singular_values_)
例子2:获取每个主成分与特征的关系
1from sklearn.datasets import load_iris
2iris = load_iris()
3from sklearn.decomposition import PCA
4pca = PCA(3)
5X, y = iris.data, iris.target
6X_proj = pca.fit_transform(X)
7for component in pca.components_:
8 print(" + ".join("%.2f x %s" % (value, name) for value, name in zip(component, iris.feature_names)))
9
10## 查看累积曲线
11print(pca.explained_variance_ratio_.cumsum())
02
增量PCA(IPCA)
PCA虽然很有用,但是需要将数据全部都存入内存,因此当当要分解的数据集太大,会导致内存很大。这时候,增量主成分分析(IPCA)通常用作主成分分析(PCA)的替代,可以通过部分计算的方式,获得跟PCA一样的结果。
使用partial_fit方法,可以分块的读取数据。
如果是稀疏矩阵或者是内存文件,使用的是numpy.memmap。
IPCA使用与输入数据样本数无关的内存量为输入数据建立低秩近似。它仍然依赖于输入数据功能,但更改批量大小可以控制内存使用量。
该函数,增加了一个batch_size的参数,用来控制批次,其余都一样,至此不再赘述。
实例
1from sklearn.datasets import load_digits
2from sklearn.decomposition import IncrementalPCA
3from scipy import sparse
4X, _ = load_digits(return_X_y=True)
5transformer = IncrementalPCA(n_components=7, batch_size=200)
6# either partially fit on smaller batches of data
7transformer.partial_fit(X[:100, :])
8# or let the fit function itself divide the data into batches
9X_sparse = sparse.csr_matrix(X)
10X_transformed = transformer.fit_transform(X_sparse)
11X_transformed.shape
03
使用随机化的SVD的PCA
对于大型矩阵的分解,我们往往会想到用SVD算法。然而当矩阵的维数与奇异值个数k上升到一定程度时,SVD分解法往往因为内存溢出而失败。因此,Randomized SVD算法,相比于SVD,它更能适应大型矩阵分解的要求,且速度更快。
此外,在某些场景下,我们期望丢掉某些lower sigular values,来达到减少噪音,保留尽可能多的方差,从而达到更好的预测效果。比如人脸的识别,如果是64X64的像素,那么整个维度有4096个。我们利用这个方法,可以保留重要的维度,从而利于后续的分析。
使用svd_solver='randomized'
可以实现随机化的SVD,来去掉部分的奇异矩阵。
04
Kernel PCA
主成分分析(Principal Components Analysis, PCA)适用于数据的线性降维。而核主成分分析(Kernel PCA,KPCA)可实现数据的非线性降维,用于处理线性不可分的数据集。kernel的选择有 {'linear', 'poly', 'rbf', 'sigmoid', 'cosine', 'precomputed'},默认是'linear'。
详细说明见官方说明,与普通的PCA差不多。
05
稀疏化PCA 和minibatchsparsePCA
SparsePCA 期望找到一组可以最优地重构数据的稀疏主成分。稀疏性的大小由参数alpha给出的L1惩罚系数来控制。Mini-batch sparse PCA是sparsePCA的变种,提高了速度,但是降低了精度。
主成分分析(PCA)的缺点是,该方法提取的成分是一种密集表达式,即用原始变量的线性组合表示时,它们的系数是非零的。这可能会使解释模型变得困难。在许多情况下,真实的基础分量可以更自然地想象为稀疏向量;例如,在人脸识别中,主成分会只包含部分的图像,映射到人脸的某些部分。稀疏主成分产生了一种更简洁的、可解释的表示,清楚地强调是哪些原始特征导致了样本之间的差异。
通过调节alpha来调整惩罚度,alpha越大,越导致许多系数为0。
02
截断SVD
TruncatedSVD是普通SVD的一个变种,只计算用户指定的前K个奇异值。TSVD通常用于语义分析中,是LSA的其中的一部分,可以解决一词多义和一义多词的问题。
LSA潜在语义分析的目的,就是要找出词(terms)在文档和查询中真正的含义,也就是潜在语义,从而解决上节所描述的问题。具体说来就是对一个大型的文档集合使用一个合理的维度建模,并将词和文档都表示到该空间,比如有2000个文档,包含7000个索引词,LSA使用一个维度为100的向量空间将文档和词表示到该空间,进而在该空间进行信息检索。而将文档表示到此空间的过程就是SVD奇异值分解和降维的过程。降维是LSA分析中最重要的一步,通过降维,去除了文档中的“噪音”,也就是无关信息(比如词的误用或不相关的词偶尔出现在一起),语义结构逐渐呈现。相比传统向量空间,潜在语义空间的维度更小,语义关系更明确。
使用例子如下:
1svd = TruncatedSVD(opts.n_components)
2svd.fit(X)
3svd.transform(X)
03
字典学习
01
使用预定义的字典来稀疏化编码
用事先预定义好的字典来对矩阵进行稀疏化编码,达到降维和简化的目的。就像人类的所有语言都是由单词组成一样,因此使用已知的词典可以减少维度;其次,稀疏化可以减少计算的成本,让后续的计算更快。
这个对象没有fit的方法,transformation方法会将数据表示为尽可能少的字典原子的线性组合。可以用transform_method来控制初始化参数,有以下几种:
Orthogonal matching pursuit (Orthogonal Matching Pursuit (OMP)):常用于图像处理中。
Least-angle regression (Least Angle Regression)
Lasso computed by least-angle regression
Lasso using coordinate descent (Lasso)
Thresholding :速度很快,但是会产生出不准确的重构结构,一般用于文本中。
1coder = SparseCoder(dictionary=D, transform_n_nonzero_coefs=n_nonzero,
2 transform_alpha=alpha, transform_algorithm=algo)
3x = coder.transform(y.reshape(1, -1))
02
通用字典学习
使用的函数为sklearn.decomposition.DictionaryLearning,会找到一个可以将fitted data足够好稀疏化的字典。
将数据表示为一个overcomplete的字典这个过程,同大脑处理数据的过程类似。这个方法在图像补丁的字典学习已被证明在诸如图像完成、修复和去噪以及监督识别任务的图像处理任务中给出良好的结果。
1dict_learner = DictionaryLearning(
2 n_components=15, transform_algorithm='lasso_lars', random_state=42,
3)
4X_transformed = dict_learner.fit_transform(X)
03
小批次字典学习
使用函数为sklearn.decomposition.MiniBatchDictionaryLearning,是一种快速的,但是精确度降低的版本,适应于大数据集合。
默认情况下,MiniBatchDictionaryLearning将数据分成小批量,并通过在指定次数的迭代中循环使用小批量,以在线方式进行优化。但是,目前它没有退出迭代的停止条件。也可以用partial_fit来实现小批次的fit。
04
因子分析
从变量中提取共性因子。
因子分析要求原有变量间具有较强的相关性,否则,因子分析无法提取变量间的共性特征,如果相关系数小于0.3,则变量间的共线性较小,不适合因子分析;因子分析得到因子和原变量的关系,因此能够对因子进行解释。
因子分析可以产生与 PCA 相似的特征(载荷矩阵的列)。不过,不能对这些特征做出任何一般性的说明(例如他们是否正交)。
使用的函数为sklearn.decomposition.FactorAnalysis。
05
独立成分分析-ICA
使用的函数为sklearn.decomposition.FastICA,ICA可以提取出一系列的主成分,彼此最大的独立。因此,ICA一般不用于降维,而用于区分叠加信号。ICA不考虑noise,为了使模型正确,必须使用whitening,可以使用whiten这个参数。
ICA 通常用于分离混合信号(称为盲源分离的问题),也可以作为一种非线性降维方法,可以找到具有一些稀疏性的特征。
主成分分析假设源信号间彼此非相关,独立成分分析假设源信号间彼此独立。
主成分分析认为主元之间彼此正交,样本呈高斯分布;独立成分分析则不要求样本呈高斯分布。
06
非负矩阵分解
非负矩阵分解,顾名思义就是,将非负的大矩阵分解成两个非负的小矩阵。在数据矩阵不包含负值的情况下,应用NMF而不是PCA或其变体。
NMF可以产生可以代表数据的主成分,从而可以来解释整个模型。
参数init,可以用来选择初始化的方法,不同的方法对结果会有不同的表现。
1import numpy as np
2X = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]])
3from sklearn.decomposition import NMF
4model = NMF(n_components=2, init='random', random_state=0)
5W = model.fit_transform(X)
6H = model.components_
7X_new = np.array([[1, 0], [1, 6.1], [1, 0], [1, 4], [3.2, 1], [0, 4]])
8W_new = model.transform(X_new)
在PCA处理中,假使将特征降维为600个,那么降维后的每个人脸都包含了600个特征(所以我们看到降维后的人脸有种“伏地魔”的感觉 ,这是因为降维处理相当于删去了部分细节特征,导致一部分信息丢失,在图片中最直观的体现就是变模糊)。而在NMF的处理中,这1000个特征相当于是被分离了。相当于,一张人脸是由鼻子、耳朵等这些独立的特征叠加出来的。
07
Latent Dirichlet Allocation (LDA)
LDA是文档主题生成模型,对离散数据集(如文本语料库)的集合的生成概率模型。它也是一个主题模型,用于从文档集合中发现抽象主题。LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。
sklearn.decomposition.LatentDirichletAllocation是用于进行LDA的函数。
1lda = LatentDirichletAllocation(n_components=5,
2 random_state=0)
3lda.fit(X)
结语
本文主体来源于sklearn的降维这一章,里面有许多数学的知识,还是需要大家自己好好的学习。
本文对PCA介绍比较详细,但是对于其他的介绍的比较简单,其实各自都有很多的用途,等小编学习后跟大家分享。
文章中许多内容是借鉴网上的内容,如果有侵权,请跟我们联系,我们会尽快修改。
参考文献
1、https://www.jianshu.com/p/1adef2d6dd88
2、https://www.jianshu.com/p/e574e91070ad
3、https://scikit-learn.org/stable/modules/decomposition.html#decompositions
4、https://shankarmsy.github.io/posts/pca-sklearn.html
5、https://mp.weixin.qq.com/s/Tl9ssjmGdeyNrNuIReo1aw
6、https://www.cnblogs.com/eczhou/p/5433856.html
7、https://scikit-learn.org/stable/auto_examples/applications/plot_face_recognition.html#sphx-glr-auto-examples-applications-plot-face-recognition-py
8、https://blog.csdn.net/fkyyly/article/details/84665361 LSA(Latent semantic analysis)
9、https://blog.csdn.net/fjssharpsword/article/details/74964127
10、https://www.jianshu.com/p/e90900a3d03a
作者:童蒙
编辑:amethyst
往期回顾